package main

import "fmt"

//在go语言中定义了：数组、切片(slice)、map、list 这几种集合类型的数据结构。常用的有切片和map，这两种属于引用类型变量

/*
数组是一个由固定长度的特定类型元素组成的序列，一个数组可以由零个或多个元素组成。
因为数组的长度是固定的，初始化之后不能添加元素，所以在Go语言中很少直接使用数组。
数组可以存放多个同一类型数据。数组也是一种数据类型，在Go中，数组是值类型。
数组的每个元素都可以通过索引来访问，索引起始0开始到数组长度减1的位置，内置函数len()可以返回数组中元素的个数。
数组： [元素1 元素2 元素3......]
*/

func main() {
	/*
		一、数组的定义：var name [元素数量]Type
		其中元素数量一定要有值，并且元素数量的值不同，就算Type相同，这两个数组也是不同的数据类型，不能相互赋值
	*/

	var course1 [3]string // 定义了一个字符类型3个元素的数组
	var course2 [5]string // 定义了一个字符类型5个元素的数组
	// 如上元素的个数不相同，两者属于不同类型，不可以相互赋值
	// course1 = course2 该写法属于错误
	fmt.Printf("%T\n", course1) // %T打印变量数据类型
	fmt.Printf("%T\n", course2)
	course1[0] = "go"
	course1[1] = "to"
	course1[2] = "shengzhen" // 通过数组下标赋值元素

	//for 循环遍历数组
	for k, v := range course1 {
		fmt.Printf("%d %s\n", k, v)
		fmt.Printf("%s\n", course1[k])
	}

	/*
		二、数组的初始化
	*/
	// 1、标准格式初始化 var name = [元素长度]Type{}
	var course3 = [3]string{"go", "python", "java"}
	for i := 0; i < len(course3); i++ {
		fmt.Println(course3[i])
	}

	// 2、简短格式初始化 name := [元素长度]Type{}
	course4 := [4]string{"xiaoming", "xiaojiang", "xiaohong", "xiaozhao"}
	for _, value := range course4 {
		fmt.Printf("%s \n", value)
	}

	// 3、不定长数组定义 name := [...]Type{}   将元素长度用...替代，初始化后不能再添加元素
	course5 := [...]int{1, 2, 3, 4, 5}
	fmt.Println(course5)

	/*
		三、数组的比较
	*/
	//当两个数组的类型一致，元素数量一致，才可以比较，当对应下标的元素都一样，才说明数组相等
	course6 := [...]int{1, 2, 3, 4, 5}
	if course6 == course5 {
		fmt.Println("相等")
	}
	course7 := [...]int{1, 2, 6, 4, 5}
	if course7 != course5 {
		fmt.Println("不相等")
	}

	/*
		四、多维数组(每个元素由两个下标固定位置)
	*/
	//1、定义初始化二维数组
	var course8 [3][4]string                          //定义一个3行4列的二维数组
	course8[0] = [4]string{"go", "1h", "jiang", "深圳"} //一行初始化值，每一行也是个数组
	course8[1] = [4]string{"ptyhon", "2h", "jiang2", "深圳"}
	course8[2] = [4]string{"java", "3h", "jiang3", "深圳"}
	// 如上是按行为维度进行初始化，也可以按每个元素逐个初始化，但不方便
	//course8[0][0] = "go"

	//2、遍历二维数组
	//第一个range按行遍历，拿到每一行的数组
	for _, v := range course8 {
		// 第二次遍历拿到每行的元素
		for _, clo := range v {
			fmt.Printf("%s\n", clo)
		}

	}
	//len()拿到的大小是行的值，即下面同样是先获取每一个的数组
	for i := 0; i < len(course8); i++ {
		fmt.Println(course8[i])
		for j := 0; j < len(course8[i]); j++ {
			fmt.Println(course8[i][j])
		}
	}
}
